package com.xspace.android.xafcommon.util;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;

public class NotifyManager {
	// 1.实例化Notification类
	// 2.设置Notification对象的icon，通知文字，声音
	// 3.实例化PendingIntent类，作为控制点击通知后显示内容的对象
	// 4.加载PendingIntent对象到Notification对象（设置 打开通知抽屉后的 标题/内容）
	// 5.获得 NotificationManager对象
	// 6.使用NotificationManager对象显示通知

	/**
	 * 发布通知
	 * 
	 * @param c
	 *            上下文
	 * @param notifyId
	 *            通知标识id
	 * @param iconResId
	 *            显示的icon的id
	 * @param textResId
	 *            显示的文字的id
	 * @param soundUri
	 *            声音
	 * @param titleResId
	 *            打开通知抽屉后的标题的id
	 * @param contentResId
	 *            打开通知抽屉后的内容的id
	 * @param intent
	 * @param flag
	 *            通知标签
	 * @return 返回Notification对象
	 */
	public static Notification notify(Context c, int notifyId, int iconResId,
			int textResId, Uri soundUri, int titleResId, int contentResId,
			Intent intent, int flag) {
		final Resources res = c.getResources();

		return notify(c, notifyId, iconResId, res.getString(textResId),
				soundUri, res.getString(titleResId),
				res.getString(contentResId), intent, flag);
	}

	/**
	 * 发布通知
	 * 
	 * @param c
	 *            上下文
	 * @param notifyId
	 *            通知标识id
	 * @param iconResId
	 *            显示的icon的id
	 * @param notifyShowText
	 *            显示的文字
	 * @param soundUri
	 *            声音 - 没有使用
	 * @param titleText
	 *            打开通知抽屉后的标题
	 * @param contentText
	 *            打开通知抽屉后的内容
	 * @param intent
	 * @param flag
	 *            通知标签
	 * @return 返回Notification对象
	 */
	public static Notification notify(Context c, int notifyId, int iconResId,
			String notifyShowText, Uri soundUri, String titleText,
			String contentText, Intent intent, int flag) {

		Notification n = genNotification(c, notifyId, iconResId,
				notifyShowText, soundUri, titleText, contentText, intent, flag);

		// 显示通知
		notify(c, notifyId, n);

		return n;
	}

	/**
	 * 发布通知
	 * 
	 * @param c
	 *            上下文
	 * @param notifyId
	 *            通知标识id
	 * @param n
	 *            通知对象
	 */
	private static void notify(Context c, int notifyId, Notification n) {
		final NotificationManager nm = (NotificationManager) c
				.getSystemService(Context.NOTIFICATION_SERVICE);

		// 显示通知
		nm.notify(notifyId, n);
	}

	/**
	 * 生成Notification对象
	 * 
	 * @param c
	 *            上下文
	 * @param notifyId
	 *            通知标识id
	 * @param iconResId
	 *            显示的icon的id
	 * @param textResId
	 *            显示的文字的id
	 * @param Uri
	 *            soundUri 声音 - 没有使用
	 * @param titleResId
	 *            打开通知抽屉后的标题的id
	 * @param contentResId
	 *            打开通知抽屉后的内容的id
	 * @param intent
	 *            intent
	 * @param flag
	 *            通知标签
	 * @return 返回Notification对象
	 */
	private static Notification genNotification(Context c, int notifyId,
			int iconResId, int textResId, Uri soundUri, int titleResId,
			int contentResId, Intent intent, int flag) {
		final Resources res = c.getResources();

		return genNotification(c, notifyId, iconResId,
				res.getString(textResId), soundUri, res.getString(titleResId),
				res.getString(contentResId), intent, flag);
	}

	/**
	 * 生成Notification对象
	 * 
	 * @param c
	 *            上下文
	 * @param notifyId
	 *            通知标识id
	 * @param iconResId
	 *            显示的icon的id
	 * @param notifyShowText
	 *            显示的文字
	 * @param soundUri
	 *            声音 - 没有使用
	 * @param titleText
	 *            打开通知抽屉后的标题
	 * @param contentText
	 *            打开通知抽屉后的内容
	 * @param intent
	 *            intent
	 * @param flag
	 *            通知标签
	 * @return 返回Notification对象
	 */
	private static Notification genNotification(Context c, int notifyId,
			int iconResId, String notifyShowText, Uri soundUri,
			String titleText, String contentText, Intent intent, int flag) {
		final Notification n = new Notification();

		// 控制点击通知后显示内容的类
		final PendingIntent ip = PendingIntent.getActivity(c, 0, // requestCode
																	// 现在是没有使用的，所以任意值都可以
				intent, 0 // PendingIntent的flag，在update这个通知的时候可以加特别的flag
				);
		// 设置通知图标
		n.icon = iconResId;
		// 通知文字
		n.tickerText = notifyShowText;
		// 通知发出的标志设置
		n.flags = flag;
		// 通知发出的声音
		if (soundUri != null) {
			n.sound = soundUri;
		}
		// 设置通知参数
		n.setLatestEventInfo(c, titleText, contentText, ip);

		return n;
	}

	/**
	 * 取消消息id为notifyid的消息显示
	 * 
	 * @param c
	 * @param notifyId
	 * @return void
	 */
	public static void cancel(Context c, int notifyId) {
		((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE))
				.cancel(notifyId);
	}

	/**
	 * 取消所有消息显示
	 * 
	 * @Description: TODO
	 * @param @param context
	 * @return
	 * @throws
	 */
	public static void cancelAll(Context c) {
		((NotificationManager) c.getSystemService(Context.NOTIFICATION_SERVICE))
				.cancelAll();
	}

	// flags
	/**
	 * 点击清除按钮不会清除消息通知,可以用来表示在正在运行
	 */
	public final static int FLAG_ONGOING_EVENT = Notification.FLAG_ONGOING_EVENT;
	/**
	 * 点击清除按钮时就会清除消息通知,但是点击通知栏的通知时不会消失
	 */
	public final static int FLAG_NO_CLEAR = Notification.FLAG_NO_CLEAR;
	/**
	 * 点击清除按钮或点击通知后会自动消失
	 */
	public final static int FLAG_AUTO_CANCEL = Notification.FLAG_AUTO_CANCEL;

}
